package log

import (
	"strings"
	"time"

	"github.com/spf13/viper"
)

type LoggerOption struct {
	Name            string // 来自哪个应用
	Level           int32  // 开始记录的级别
	TimestampFormat string // 时间戳格式
	Caller          bool   // 是否带源码信息
	CallerSkip      int    // 为了更准确的定位源码，所以需要传入此参数
	Console         bool   // 是否输出到控制台
	ConsoleColorful bool   // 控制台是否彩色
	QueueSize       int    // 队列大小
}

func (o *LoggerOption) Load(name string, cfg *viper.Viper) {
	if cfg == nil {
		return
	}

	o.Name = cfg.GetString("name")

	if o.Name == "" {
		o.Name = name
	}

	sLevel := strings.ToLower(cfg.GetString("level"))
	switch sLevel {
	case "debug":
		o.Level = LevelDebug
	case "info":
		o.Level = LevelInfo
	case "warn":
		o.Level = LevelWarn
	case "error":
		o.Level = LevelError
	default:
		o.Level = LevelDebug
	}

	o.TimestampFormat = cfg.GetString("timestampformat")

	o.Caller = cfg.GetBool("caller")

	o.CallerSkip = cfg.GetInt("callerskip")

	o.Console = cfg.GetBool("console")

	o.ConsoleColorful = cfg.GetBool("consolecolorful")

	o.QueueSize = cfg.GetInt("queuesize")
}

type FileOption struct {
	Name            string        // 文件名
	Dir             string        // 目录
	MaxSize         int64         // 单个文件大小上限
	MaxAge          time.Duration // 文件保存时长
	SeperatedLevels int32         // 单独写文件的等级
	QueueSize       int           // 队列大小
	TickInterval    time.Duration // tick间隔
}

func (o *FileOption) Load(name string, cfg *viper.Viper) {
	if cfg == nil {
		return
	}

	o.Name = cfg.GetString("name")

	if o.Name == "" {
		o.Name = name
	}

	o.Dir = cfg.GetString("dir")

	o.MaxSize = cfg.GetInt64("maxsize")

	o.MaxAge = cfg.GetDuration("maxage") * 24 * time.Hour

	// todo SeperatedLevels待定

	o.QueueSize = cfg.GetInt("queuesize")

	o.TickInterval = cfg.GetDuration("tickinteval") * time.Second
}
